// Logic 249: Menus and ego animation

#include "defines.txt"
#define temp v255

if (game_restored) {
  clear.lines(23, 24, 0);
  reset(debug_active);
}

if (!disable_game_functions) {
  if (controller(key_activate_menu)) {
    menu.input();
  }
}

if (controller(menu_about)) {
  call(about_game);
}

if ((controller(menu_fastestspeed) ||
     said("fastest") ||
     said("fastest", "speed"))) {
  cycle_delay = speed_fastest;
}

if ((controller(menu_fastspeed) ||
     said("fast") ||
     said("fast", "speed"))) {
  cycle_delay = speed_fast;
}

if ((controller(menu_normalspeed) ||
     said("normal") ||
     said("normal", "speed"))) {
  cycle_delay = speed_normal;
}

if ((controller(menu_slowspeed) ||
     said("slow") ||
     said("slow", "speed"))) {
  cycle_delay = speed_slow;
}

if (controller(key_decreasevolume)) {
  sound_volume--;
}

if (controller(key_increasevolume) && sound_volume < 15) {
  sound_volume++;
}

if (controller(menu_soundonoff)) {
  toggle(sound_on);
}

if (!debug_active) {
  if ((said("debug") || controller(key_debug))) {
    set(debug_active);
    print("Debug mode activated.\n\nType \"debug help\" for more information.");
    version();
    player.control();
    status.line.on();
    load.logics(debug);
  }
}

if (!disable_game_functions) {

  if ((controller(menu_save) ||
       said("save", "game") ||
       said("save"))) {
    stop.sound();
    save.game();
  }

  if ((controller(menu_restore) ||
       said("restore", "game") ||
       said("restore"))) {
    stop.sound();
    restore.game();
  }

  if ((controller(menu_restart) ||
       said("restart", "game") ||
       said("restart"))) {
    restart.game();
  }

  if ((controller(menu_help) ||
       said("help"))) {
    call(help_screen);
  }

  if (controller(key_echoline)) {
    echo.line();
  }

  if (controller(key_clearinputline)) {
    cancel.line();
  }

  if ((controller(menu_inventory) ||
       said("inventory"))) {
    status();
  }

  if ((controller(menu_seeobject) ||
       controller(key_seeobject) ||
       said("look", "inventory"))) {
    set(inventory_select_enabled);
    status();
    if (selected_inventory_item > 0 && selected_inventory_item != 255) {
      temp = selected_inventory_item;
      temp += 100;
      show.obj.v(temp);
    }
    if (selected_inventory_item == 6) {
      print("(With apologies to Gertrude Stein and Al Lowe.)");
    }
    reset(inventory_select_enabled);
  }

  if ((controller(menu_quit) ||
       said("quit", "game") ||
       said("quit"))) {
    stop.sound();
    quit(0);
  }
}

if (new_room) {
  animate.obj(ego);
  load.view.v(ego_view_no);
  set.view.v(ego, ego_view_no);
  observe.objs(ego);
  clear.lines(24, 24, 0);
}

if (!anim_begun) {

  get.posn(ego, new_ego_x, new_ego_y);

  if (ego_dir == old_ego_dir &&
      new_ego_x == old_ego_x &&
      new_ego_y == old_ego_y) {
    stop.cycling(ego);
  }
  else {
    if (!never_animate_ego) {
      start.cycling(ego);
    }
  }

  old_ego_x = new_ego_x;
  old_ego_y = new_ego_y;
  old_ego_dir = ego_dir;

  if (always_animate_ego) {
    start.cycling(ego);
  }
  else {
    if ((ego_dir == stopped || never_animate_ego)) {
      stop.cycling(ego);
    }
  }

}

return();